package sdw.ufal.p3.action;

import java.util.List;

import gov.tjpr.entity.pagination.Page;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import sdw.ufal.p3.entity.Atividade;
import sdw.ufal.p3.entity.Decisao;
import sdw.ufal.p3.entity.Processo;
import sdw.ufal.p3.form.ProcessoForm;
import sdw.ufal.p3.service.AtividadeService;
import sdw.ufal.p3.service.DecisaoService;
import sdw.ufal.p3.service.ProcessoService;
import sdw.ufal.p3.util.BaseDispatchActionSupport;
import sdw.ufal.p3.util.Constants;
import sdw.ufal.p3.util.ConstantsForward;


public class ProcessoAction extends BaseDispatchActionSupport {

	public ProcessoService getProcessoService() {
		return (ProcessoService)getService(Constants.PROCESSO_SERVICE);
	}
	
	public ProcessoService getProcessoServiceTeste(){
		return (ProcessoService)getService(Constants.PROCESSO_SERVICE);
	}
	public AtividadeService getAtividadeService() {
		return (AtividadeService)getService(Constants.ATIVIDADE_SERVICE);
	}
	public DecisaoService getDecisaoService() {
		return (DecisaoService)getService(Constants.DECISAO_SERVICE);
	}
	
	public ActionForward cadastrar(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
		return null;
	}
	
	public ActionForward listar(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
		ProcessoForm form = (ProcessoForm)actionForm;

		Page<Processo> processos = new Page<Processo>( Integer.parseInt( form.getProcessoPageSize() ), 
														    Integer.parseInt( form.getProcessoPageNumber() ), 
														    form.getProcessoSortColumn(), 
														    form.getProcessoSortOrder() );
		
		processos = getProcessoService().findProcessosAtivos(processos);
		
		return mapping.findForward(ConstantsForward.FWD_LIST);
	}
	
	public ActionForward visualizar(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
		// inicializa variáveis
		ProcessoForm form = (ProcessoForm)actionForm;
		
		// inicializa o processo
		Processo processo = getProcessoService().getById(Long.parseLong(form.getId()));
		request.setAttribute("processo", processo);

//		// inicializa flag indicando quais abas devem ser exibidas
//		String showMaskTab = "tabDadosProcesso,tabPartes,tabMovimentacoesProcesso";
//		request.setAttribute("showMaskTab", showMaskTab);
		
		request.setAttribute("flagShowButtonAlterar", true);
		
		// direciona para a tela de visualização
		return mapping.findForward(ConstantsForward.FWD_DETAIL);
	}
	
	public ActionForward editar(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
		// preenche o form
		this.setFormProperties(actionForm, request);

		// salva o token para evitar duplo-submit
		saveToken(request);
		
		// direciona para a tela de edição
		return this.carregar(mapping, actionForm, request, response);		
	}
	
	private ActionForward carregar(ActionMapping mapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) {
		// TODO Auto-generated method stub
		return null;
	}
	public ActionForward salvarEdicao(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
		// checa o token para evitar duplo-submit
		if( !isTokenValid(request) ) {
			// é duplo-submit, então direciona para a tela de visualização do processo
			return this.visualizar(mapping, actionForm, request, response);
		}	

		// inicializa variáveis
		ProcessoForm form = (ProcessoForm)actionForm;

		// inicializa os processos
		Processo processoNew = getProcessoService().getById(Long.parseLong(form.getId()));
		Processo processoOld = getProcessoService().getById(Long.parseLong(form.getId()));
		
		// obtém classe processual, assunto principal, etc
		List<Atividade> atividades   = getAtividadeService().findAllByProcesso(processoNew);
		List<Decisao> decisoes   	 = getDecisaoService().findAllByProcesso(processoNew);
		
//		// seta os dados do processo que foram modificados
//		processoNew.setAtividades(atividades);
//		processoNew.setDecisoes(decisoes);

		// grava o processo
		getProcessoService().saveModificarDados(processoNew, processoOld);		
		
		// reseta o token para evitar duplo-submit
		resetToken(request);		
		
		// exibe mensagem de sucesso
		ActionMessages messages = new ActionMessages();
		messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("Dados registrados."));
		saveMessages(request.getSession(false), messages); 

		// direciona para a tela de visualização
		return this.visualizar(mapping, actionForm, request, response);
	}

	/**
	 * Preenchimento do form, para edição
	 */
	private void setFormProperties(ActionForm actionForm, HttpServletRequest request) {
		// se NÃO for edição, ignora
		ProcessoForm form = (ProcessoForm)actionForm;
		if( (form.getId() == null) || (form.getId().length() == 0) || (Long.parseLong(form.getId()) == 0L) )
			return;
		
		// obtém o processo
		Processo processo = getProcessoService().getById(Long.parseLong(form.getId()));
		
		// preeenche o id do processo
		form.setId(String.valueOf(processo.getId()));
		
		// preenche as atividades e decisões
//		form.setAtividades(processo.getAtividades());
//			form.setDescricaoClasseProcessual(processo.getClasseProcessual().getDescricaoCompleta());
//		form.setDecisoes(processo.getDecisoes());
//			form.setDescricaoAssuntoPrincipal(processo.getAssuntoPrincipal().getDescricaoCompleta());
		
//		// preenche os assunto secundários
//		List<Assunto> listaAssuntosSecundarios = new ArrayList<Assunto>();
//		if( processo.getAssuntosSecundarios() != null ) {
//			Iterator<ProcessoAssunto> itr = processo.getAssuntosSecundarios().iterator();
//			while( itr.hasNext() ) {
//				ProcessoAssunto pa = itr.next();
//				listaAssuntosSecundarios.add(pa.getAssunto());
//			}
//		}
//		request.getSession(false).setAttribute("listaAssuntosSecundarios", listaAssuntosSecundarios);
		
		// preenche demais campos que são editáveis
//		form.setSegredoJustica(processo.isSegredoJustica());
//		form.setIdPrioridade(processo.getPrioridade().getId());
		
	}	
	
}
